{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['/home/magupta/anaconda3/envs/stackoverflow_env/RedHat', '/usr/lib64/python37.zip', '/usr/lib64/python3.7', '/usr/lib64/python3.7/lib-dynload', '', '/home/magupta/.local/lib/python3.7/site-packages', '/usr/local/lib64/python3.7/site-packages', '/usr/local/lib/python3.7/site-packages', '/usr/lib64/python3.7/site-packages', '/usr/lib/python3.7/site-packages', '/usr/local/lib/python3.7/site-packages/IPython/extensions', '/home/magupta/.ipython']\n"
     ]
    }
   ],
   "source": [
    "from __future__ import absolute_import\n",
    "import sys\n",
    "print(sys.path)\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "import tensorflow.keras\n",
    "from tensorflow.keras import backend\n",
    "from tensorflow.keras.preprocessing.text import Tokenizer\n",
    "from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
    "from tensorflow.keras.layers import Input, TimeDistributed, Dense, Lambda, concatenate, Dropout, BatchNormalization\n",
    "from tensorflow.keras.layers import Embedding\n",
    "from sklearn.model_selection import train_test_split\n",
    "from tensorflow.keras.layers import Bidirectional\n",
    "from tensorflow.keras.layers import LSTM\n",
    "from tensorflow.keras.models import Model\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "import os\n",
    "from tensorflow.keras.layers import LeakyReLU\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import f1_score, accuracy_score , recall_score , precision_score\n",
    "from sklearn.metrics import classification_report\n",
    "from tensorflow.keras.models import Sequential\n",
    "from tensorflow.keras.layers import Dense"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib64/python3.7/site-packages/numpy/lib/arraysetops.py:569: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n",
      "  mask |= (ar1 == a)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(1264212, 27)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_full=pd.read_csv(\"data_stackOverflow/final_dataframe_with_1tag_onehot.csv\",index_col=0)\n",
    "df_full.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([16, 20,  4,  5,  0,  7,  3,  2, 17, 10, 11,  6, 15, 13, 18, 19, 12,\n",
       "        1,  9,  8, 14])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label_encoder = LabelEncoder() \n",
    "df_full['maintag']= label_encoder.fit_transform(df_full['maintag'].astype(str)) \n",
    "df_full['maintag'].unique() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['.net', 'android', 'asp.net', 'c', 'c#', 'c++', 'css', 'html',\n",
       "       'ios', 'iphone', 'java', 'javascript', 'jquery', 'mysql', 'nan',\n",
       "       'objective-c', 'other', 'php', 'python', 'ruby-on-rails', 'sql'],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label_encoder.classes_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "score_col = [col for col in df_full if col.startswith('ques_score_')]\n",
    "label_col = [col for col in df_full if col.startswith('tag_')]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['ques_title', 'ques_body', 'ques_score_bad', 'ques_score_medium',\n",
       "       'ques_score_good', 'tag_.net', 'tag_android', 'tag_asp.net', 'tag_c',\n",
       "       'tag_c#', 'tag_c++', 'tag_css', 'tag_html', 'tag_ios', 'tag_iphone',\n",
       "       'tag_java', 'tag_javascript', 'tag_jquery', 'tag_mysql',\n",
       "       'tag_objective-c', 'tag_other', 'tag_php', 'tag_python',\n",
       "       'tag_ruby-on-rails', 'tag_sql', 'maintag', 'all_tags'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_full.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1264212, 27)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_full.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "df=df_full.sample(n=100000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ques_title</th>\n",
       "      <th>ques_body</th>\n",
       "      <th>ques_score_bad</th>\n",
       "      <th>ques_score_medium</th>\n",
       "      <th>ques_score_good</th>\n",
       "      <th>tag_.net</th>\n",
       "      <th>tag_android</th>\n",
       "      <th>tag_asp.net</th>\n",
       "      <th>tag_c</th>\n",
       "      <th>tag_c#</th>\n",
       "      <th>...</th>\n",
       "      <th>tag_jquery</th>\n",
       "      <th>tag_mysql</th>\n",
       "      <th>tag_objective-c</th>\n",
       "      <th>tag_other</th>\n",
       "      <th>tag_php</th>\n",
       "      <th>tag_python</th>\n",
       "      <th>tag_ruby-on-rails</th>\n",
       "      <th>tag_sql</th>\n",
       "      <th>maintag</th>\n",
       "      <th>all_tags</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>330904</th>\n",
       "      <td>rail select associ model nest form</td>\n",
       "      <td>associ item associ exampl model pre code custo...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>19</td>\n",
       "      <td>ruby-on-rails/other/other/other</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>166458</th>\n",
       "      <td>touchesmov self view</td>\n",
       "      <td>i work import project job place problem i stac...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "      <td>iphone/objective-c/other/other/other</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 27 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                ques_title  \\\n",
       "330904  rail select associ model nest form   \n",
       "166458                touchesmov self view   \n",
       "\n",
       "                                                ques_body  ques_score_bad  \\\n",
       "330904  associ item associ exampl model pre code custo...               1   \n",
       "166458  i work import project job place problem i stac...               0   \n",
       "\n",
       "        ques_score_medium  ques_score_good  tag_.net  tag_android  \\\n",
       "330904                  0                0         0            0   \n",
       "166458                  0                1         0            0   \n",
       "\n",
       "        tag_asp.net  tag_c  tag_c#  ...  tag_jquery  tag_mysql  \\\n",
       "330904            0      0       0  ...           0          0   \n",
       "166458            0      0       0  ...           0          0   \n",
       "\n",
       "        tag_objective-c  tag_other  tag_php  tag_python  tag_ruby-on-rails  \\\n",
       "330904                0          0        0           0                  1   \n",
       "166458                0          0        0           0                  0   \n",
       "\n",
       "        tag_sql  maintag                              all_tags  \n",
       "330904        0       19       ruby-on-rails/other/other/other  \n",
       "166458        0        9  iphone/objective-c/other/other/other  \n",
       "\n",
       "[2 rows x 27 columns]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "train, val_test = train_test_split(df, test_size=0.2)\n",
    "val,test=train_test_split(val_test, test_size=0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5.80565, 21, 1, 136.5811125, 4741, 1)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c=train['ques_title'].apply(lambda x: len(str(x).split()))\n",
    "d=train['ques_body'].apply(lambda x: len(str(x).split()))\n",
    "c.mean(),c.max(),c.min(),d.mean(),d.max(),d.min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train = train.drop(label_col+['maintag']+['all_tags'],axis=1)\n",
    "x_val = val.drop(label_col+['maintag']+['all_tags'],axis=1)\n",
    "x_test = test.drop(label_col+['maintag']+['all_tags'],axis=1)\n",
    "y_train_onehot = train[label_col]\n",
    "y_test_onehot = test[label_col]\n",
    "y_val_onehot = val[label_col]\n",
    "y_train_multiclass = train['maintag']\n",
    "y_test_multiclass = test['maintag']\n",
    "y_val_multiclass = val['maintag']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(80000, 20)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_onehot.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ques_title</th>\n",
       "      <th>ques_body</th>\n",
       "      <th>ques_score_bad</th>\n",
       "      <th>ques_score_medium</th>\n",
       "      <th>ques_score_good</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>136572</th>\n",
       "      <td>get backward window cycl cmd shift work emac app</td>\n",
       "      <td>cmd work fine tri cmd shift get messag undefin</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1167204</th>\n",
       "      <td>django updat creat</td>\n",
       "      <td>i model pre code class xyz model model uniqu c...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                               ques_title  \\\n",
       "136572   get backward window cycl cmd shift work emac app   \n",
       "1167204                                django updat creat   \n",
       "\n",
       "                                                 ques_body  ques_score_bad  \\\n",
       "136572      cmd work fine tri cmd shift get messag undefin               0   \n",
       "1167204  i model pre code class xyz model model uniqu c...               1   \n",
       "\n",
       "         ques_score_medium  ques_score_good  \n",
       "136572                   1                0  \n",
       "1167204                  0                0  "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>tag_.net</th>\n",
       "      <th>tag_android</th>\n",
       "      <th>tag_asp.net</th>\n",
       "      <th>tag_c</th>\n",
       "      <th>tag_c#</th>\n",
       "      <th>tag_c++</th>\n",
       "      <th>tag_css</th>\n",
       "      <th>tag_html</th>\n",
       "      <th>tag_ios</th>\n",
       "      <th>tag_iphone</th>\n",
       "      <th>tag_java</th>\n",
       "      <th>tag_javascript</th>\n",
       "      <th>tag_jquery</th>\n",
       "      <th>tag_mysql</th>\n",
       "      <th>tag_objective-c</th>\n",
       "      <th>tag_other</th>\n",
       "      <th>tag_php</th>\n",
       "      <th>tag_python</th>\n",
       "      <th>tag_ruby-on-rails</th>\n",
       "      <th>tag_sql</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>136572</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1167204</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         tag_.net  tag_android  tag_asp.net  tag_c  tag_c#  tag_c++  tag_css  \\\n",
       "136572          0            0            0      0       0        0        0   \n",
       "1167204         0            0            0      0       0        0        0   \n",
       "\n",
       "         tag_html  tag_ios  tag_iphone  tag_java  tag_javascript  tag_jquery  \\\n",
       "136572          0        0           0         0               0           0   \n",
       "1167204         0        0           0         0               0           0   \n",
       "\n",
       "         tag_mysql  tag_objective-c  tag_other  tag_php  tag_python  \\\n",
       "136572           0                0          1        0           0   \n",
       "1167204          0                0          1        0           0   \n",
       "\n",
       "         tag_ruby-on-rails  tag_sql  \n",
       "136572                   0        0  \n",
       "1167204                  0        0  "
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_onehot.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "nb_words = 30000\n",
    "EMBEDDING_DIM = 50\n",
    "MAX_SEQUENCE_LENGTH_1=20\n",
    "MAX_SEQUENCE_LENGTH_2=150\n",
    "DROPOUT = 0.1\n",
    "num_epoch=20"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "tokenizer = Tokenizer(lower=True,num_words=nb_words) \n",
    "tokenizer.fit_on_texts(np.concatenate((x_train.ques_title.astype(str), x_train.ques_body.astype(str)), axis=0))\n",
    "\n",
    "sequences_train_q1 = tokenizer.texts_to_sequences(x_train.ques_title.astype(str))\n",
    "sequences_train_q2 = tokenizer.texts_to_sequences(x_train.ques_body.astype(str))\n",
    "\n",
    "sequences_val_q1 = tokenizer.texts_to_sequences(x_val.ques_title.astype(str))\n",
    "sequences_val_q2 = tokenizer.texts_to_sequences(x_val.ques_body.astype(str))\n",
    "\n",
    "word_index = tokenizer.word_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "269639"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(word_index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "sequences_train_q1_padded = pad_sequences(sequences_train_q1, maxlen=MAX_SEQUENCE_LENGTH_1)\n",
    "sequences_train_q2_padded = pad_sequences(sequences_train_q2, maxlen=MAX_SEQUENCE_LENGTH_2)\n",
    "\n",
    "sequences_val_q1_padded = pad_sequences(sequences_val_q1, maxlen=MAX_SEQUENCE_LENGTH_1)\n",
    "sequences_val_q2_padded = pad_sequences(sequences_val_q2, maxlen=MAX_SEQUENCE_LENGTH_2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "word_embedding_matrix = np.zeros((nb_words+1, EMBEDDING_DIM))\n",
    "\n",
    "embeddings_index = {}\n",
    "\n",
    "f = open('glove.6B.50d.txt')\n",
    "\n",
    "for line in f:\n",
    "    values = line.split()\n",
    "    word = values[0]       \n",
    "    coefs = np.asarray(values[1:], dtype='float32')\n",
    "    embeddings_index[word] = coefs\n",
    "    \n",
    "f.close()\n",
    "\n",
    "for word, i in word_index.items():\n",
    "    if i >= nb_words:\n",
    "        continue\n",
    "    embedding_vector = embeddings_index.get(word)\n",
    "    if embedding_vector is not None:\n",
    "        word_embedding_matrix[i] = embedding_vector"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_features=x_train.drop(['ques_title','ques_body'],axis=1)\n",
    "val_features=x_val.drop(['ques_title','ques_body'],axis=1)\n",
    "test_features=x_test.drop(['ques_title','ques_body'],axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((80000, 3), (10000, 3))"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_features.shape,val_features.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Timestamp layer wrapper applies a layer to every temporal slice of an input.\n",
    "The input should be at least 3D, and the dimension of index one will be considered to be the temporal dimension.\n",
    "Consider a batch of 32 samples, where each sample is a sequence of 10 vectors of 16 dimensions. The batch input shape of the layer is then (32, 10, 16), and the input_shape, not including the samples dimension, is (10, 16).\n",
    "You can then use TimeDistributed to apply a Dense layer to each of the 10 timesteps, independently:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "ques_title = Input(shape=(MAX_SEQUENCE_LENGTH_1,))\n",
    "ques_body = Input(shape=(MAX_SEQUENCE_LENGTH_2,))\n",
    "features  = Input(shape=(train_features.shape[1],))\n",
    "\n",
    "q1 = Embedding(nb_words + 1, \n",
    "                 EMBEDDING_DIM, \n",
    "                 weights=[word_embedding_matrix], \n",
    "                 input_length=MAX_SEQUENCE_LENGTH_1, \n",
    "                 trainable=True)(ques_title)\n",
    "\n",
    "q2 = Embedding(nb_words + 1, \n",
    "                 EMBEDDING_DIM, \n",
    "                 weights=[word_embedding_matrix], \n",
    "                 input_length=MAX_SEQUENCE_LENGTH_2, \n",
    "                 trainable=True)(ques_body)\n",
    "\n",
    "shared_lstm_1=Bidirectional(LSTM(400, return_sequences=True), merge_mode=\"sum\")\n",
    "shared_lstm_2=Bidirectional(LSTM(200), merge_mode=\"sum\")\n",
    "\n",
    "q1 = shared_lstm_1(q1)\n",
    "q1= Dropout(DROPOUT)(q1)\n",
    "q1=shared_lstm_2(q1)\n",
    "\n",
    "q2 = shared_lstm_1(q2)\n",
    "q2= Dropout(DROPOUT)(q2)\n",
    "q2=shared_lstm_2(q2)\n",
    "\n",
    "merged = concatenate([q1,q2,features])\n",
    "\n",
    "merged = Dense(1000)(merged)\n",
    "merged=LeakyReLU(alpha=0.3)(merged)\n",
    "merged = Dropout(DROPOUT)(merged)\n",
    "merged = BatchNormalization()(merged)\n",
    "\n",
    "merged = Dense(500)(merged)\n",
    "merged=LeakyReLU(alpha=0.3)(merged)\n",
    "merged = Dropout(DROPOUT)(merged)\n",
    "merged = BatchNormalization()(merged)\n",
    "\n",
    "merged = Dense(200)(merged)\n",
    "merged=LeakyReLU(alpha=0.3)(merged)\n",
    "merged = Dropout(DROPOUT)(merged)\n",
    "merged = BatchNormalization()(merged)\n",
    "\n",
    "is_true_20 = Dense(20, activation='softmax')(merged)\n",
    "\n",
    "model = Model(inputs=[ques_title,ques_body,features], outputs=[is_true_20])\n",
    "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model\"\n",
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "input_1 (InputLayer)            [(None, 20)]         0                                            \n",
      "__________________________________________________________________________________________________\n",
      "input_2 (InputLayer)            [(None, 150)]        0                                            \n",
      "__________________________________________________________________________________________________\n",
      "embedding (Embedding)           (None, 20, 50)       1500050     input_1[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "embedding_1 (Embedding)         (None, 150, 50)      1500050     input_2[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "bidirectional (Bidirectional)   multiple             1443200     embedding[0][0]                  \n",
      "                                                                 embedding_1[0][0]                \n",
      "__________________________________________________________________________________________________\n",
      "dropout (Dropout)               (None, 20, 400)      0           bidirectional[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "dropout_1 (Dropout)             (None, 150, 400)     0           bidirectional[1][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bidirectional_1 (Bidirectional) (None, 200)          961600      dropout[0][0]                    \n",
      "                                                                 dropout_1[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "input_3 (InputLayer)            [(None, 3)]          0                                            \n",
      "__________________________________________________________________________________________________\n",
      "concatenate (Concatenate)       (None, 403)          0           bidirectional_1[0][0]            \n",
      "                                                                 bidirectional_1[1][0]            \n",
      "                                                                 input_3[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "dense (Dense)                   (None, 1000)         404000      concatenate[0][0]                \n",
      "__________________________________________________________________________________________________\n",
      "leaky_re_lu (LeakyReLU)         (None, 1000)         0           dense[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "dropout_2 (Dropout)             (None, 1000)         0           leaky_re_lu[0][0]                \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization (BatchNorma (None, 1000)         4000        dropout_2[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "dense_1 (Dense)                 (None, 500)          500500      batch_normalization[0][0]        \n",
      "__________________________________________________________________________________________________\n",
      "leaky_re_lu_1 (LeakyReLU)       (None, 500)          0           dense_1[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "dropout_3 (Dropout)             (None, 500)          0           leaky_re_lu_1[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_1 (BatchNor (None, 500)          2000        dropout_3[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "dense_2 (Dense)                 (None, 200)          100200      batch_normalization_1[0][0]      \n",
      "__________________________________________________________________________________________________\n",
      "leaky_re_lu_2 (LeakyReLU)       (None, 200)          0           dense_2[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "dropout_4 (Dropout)             (None, 200)          0           leaky_re_lu_2[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_2 (BatchNor (None, 200)          800         dropout_4[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "dense_3 (Dense)                 (None, 20)           4020        batch_normalization_2[0][0]      \n",
      "==================================================================================================\n",
      "Total params: 6,420,420\n",
      "Trainable params: 6,417,020\n",
      "Non-trainable params: 3,400\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 80000 samples, validate on 10000 samples\n",
      "Epoch 1/10\n",
      "80000/80000 [==============================] - 1751s 22ms/sample - loss: 1.8262 - acc: 0.4644 - val_loss: 1.3596 - val_acc: 0.5762\n",
      "Epoch 2/10\n",
      "80000/80000 [==============================] - 1737s 22ms/sample - loss: 1.1595 - acc: 0.6145 - val_loss: 1.2997 - val_acc: 0.5863\n",
      "Epoch 3/10\n",
      "80000/80000 [==============================] - 1779s 22ms/sample - loss: 0.9576 - acc: 0.6687 - val_loss: 1.0537 - val_acc: 0.6439\n",
      "Epoch 4/10\n",
      "80000/80000 [==============================] - 1947s 24ms/sample - loss: 0.8284 - acc: 0.7077 - val_loss: 1.0967 - val_acc: 0.6486\n",
      "Epoch 5/10\n",
      "80000/80000 [==============================] - 1839s 23ms/sample - loss: 0.7309 - acc: 0.7401 - val_loss: 1.0692 - val_acc: 0.6483\n",
      "Epoch 6/10\n",
      "80000/80000 [==============================] - 1873s 23ms/sample - loss: 0.6522 - acc: 0.7682 - val_loss: 1.1242 - val_acc: 0.6415\n",
      "Epoch 7/10\n",
      "80000/80000 [==============================] - 1866s 23ms/sample - loss: 0.5719 - acc: 0.7961 - val_loss: 1.1721 - val_acc: 0.6489\n",
      "Epoch 8/10\n",
      "80000/80000 [==============================] - 1854s 23ms/sample - loss: 0.4989 - acc: 0.8225 - val_loss: 1.2716 - val_acc: 0.6351\n",
      "Epoch 9/10\n",
      "80000/80000 [==============================] - 1725s 22ms/sample - loss: 0.4297 - acc: 0.8485 - val_loss: 1.4043 - val_acc: 0.6290\n",
      "Epoch 10/10\n",
      "80000/80000 [==============================] - 1724s 22ms/sample - loss: 0.3664 - acc: 0.8720 - val_loss: 1.4576 - val_acc: 0.6305\n"
     ]
    }
   ],
   "source": [
    "history=model.fit([sequences_train_q1_padded,sequences_train_q2_padded,x_train[score_col]], y_train_onehot, batch_size=64, epochs=10,validation_data=([sequences_val_q1_padded,sequences_val_q2_padded, x_val[score_col]],y_val_onehot))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dict_keys(['loss', 'acc', 'val_loss', 'val_acc'])\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "print(history.history.keys())\n",
    "# summarize history for accuracy\n",
    "plt.plot(history.history['acc'])\n",
    "plt.plot(history.history['val_acc'])\n",
    "plt.title('model accuracy')\n",
    "plt.ylabel('accuracy')\n",
    "plt.xlabel('epoch')\n",
    "plt.legend(['train', 'test'], loc='upper left')\n",
    "plt.show()\n",
    "# summarize history for loss\n",
    "plt.plot(history.history['loss'])\n",
    "plt.plot(history.history['val_loss'])\n",
    "plt.title('model loss')\n",
    "plt.ylabel('loss')\n",
    "plt.xlabel('epoch')\n",
    "plt.legend(['train', 'test'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "sequences_test_data_q1 = tokenizer.texts_to_sequences(x_test.ques_title.astype(str))\n",
    "sequences_test_data_q2 = tokenizer.texts_to_sequences(x_test.ques_body.astype(str))\n",
    "sequences_test_data_q1_padded = pad_sequences(sequences_test_data_q1, maxlen=MAX_SEQUENCE_LENGTH_1)\n",
    "sequences_test_data_q2_padded = pad_sequences(sequences_test_data_q2, maxlen=MAX_SEQUENCE_LENGTH_2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred_multiclass = model.predict([sequences_test_data_q1_padded, sequences_test_data_q2_padded,test_features])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[3.9749897e-09, 2.7190433e-06, 5.9435514e-09, ..., 9.9269205e-01,\n",
       "        2.3494060e-05, 5.2619043e-07],\n",
       "       [2.7188618e-04, 1.2672310e-06, 1.0931223e-05, ..., 8.8604320e-06,\n",
       "        6.9272046e-09, 1.1333194e-05],\n",
       "       [2.2515417e-07, 1.0305396e-06, 1.2762313e-06, ..., 5.0657154e-06,\n",
       "        1.2917703e-04, 1.0207879e-05],\n",
       "       ...,\n",
       "       [7.1750937e-06, 1.6534458e-04, 1.2422693e-07, ..., 6.0076032e-05,\n",
       "        8.0828919e-08, 1.2326767e-04],\n",
       "       [4.3628611e-06, 2.3041633e-03, 9.0246649e-06, ..., 2.1145288e-03,\n",
       "        3.9639042e-04, 8.3027629e-04],\n",
       "       [1.7111513e-06, 5.8346387e-07, 1.5446674e-06, ..., 3.6001304e-05,\n",
       "        2.2558075e-04, 2.5052580e-03]], dtype=float32)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred_multiclass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "indices_multiclass = y_pred_multiclass.argmax(axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.27      0.30      0.29        70\n",
      "           1       0.73      0.77      0.75       575\n",
      "           2       0.50      0.27      0.35       129\n",
      "           3       0.52      0.55      0.53       141\n",
      "           4       0.62      0.53      0.57       816\n",
      "           5       0.71      0.57      0.63       352\n",
      "           6       0.30      0.16      0.21        89\n",
      "           7       0.36      0.36      0.36       148\n",
      "           8       0.56      0.50      0.53       271\n",
      "           9       0.42      0.31      0.36       142\n",
      "          10       0.68      0.62      0.65       903\n",
      "          11       0.60      0.65      0.63       964\n",
      "          12       0.51      0.38      0.43       252\n",
      "          13       0.53      0.51      0.52       138\n",
      "          14       0.00      0.00      0.00         1\n",
      "          15       0.00      0.22      0.01        81\n",
      "          16       0.20      0.04      0.07      3405\n",
      "          17       0.00      0.00      0.00       686\n",
      "          18       0.00      0.00      0.00       501\n",
      "          19       0.01      0.01      0.01       162\n",
      "          20       0.00      0.00      0.00       174\n",
      "\n",
      "    accuracy                           0.30     10000\n",
      "   macro avg       0.36      0.32      0.33     10000\n",
      "weighted avg       0.37      0.30      0.31     10000\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib64/python3.7/site-packages/sklearn/metrics/_classification.py:1272: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n"
     ]
    }
   ],
   "source": [
    "report_multiclass=classification_report(y_test_multiclass, indices_multiclass)\n",
    "print(report_multiclass)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.save('multiclass_model_lstm.h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
